package com.dwy2002.product.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dwy2002.common.Result;
import com.dwy2002.common.exception.EmptyIdException;
import com.dwy2002.common.utils.OssUtils;
import com.dwy2002.enums.Status;
import com.dwy2002.pojo.dto.product.ProductsImagesDTO;
import com.dwy2002.pojo.po.product.ProductImages;
import com.dwy2002.pojo.vo.UploadImagesVO;
import com.dwy2002.product.mapper.ProductImagesMapper;
import com.dwy2002.product.service.IProductImagesService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

import static com.dwy2002.common.Result.*;
import static com.dwy2002.common.utils.OssUtils.isFileOver;
import static com.dwy2002.common.utils.Utils.*;
import static com.dwy2002.enums.OssEnum.PRODUCT_IMAGE;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/02/17
 */
@Service
@RequiredArgsConstructor
public class ProductImagesServiceImpl extends ServiceImpl<ProductImagesMapper, ProductImages> implements IProductImagesService {
    private final OssUtils ossUtils;

    /**
     * 保存商品图片
     *
     * @param images 图片集合DTO
     * @return true：保存成功，false：保存失败
     * @author 杜伟毅
     * @since 2025/2/24 0024 21:27
     */
    @Override
    public boolean saveProductImage(ProductsImagesDTO images) {
        if (isEmptyOrNull(images.getProductId()) || isEmptyOrNull(images.getImageUrl())) {
            return false;
        }
        return save(BeanUtil.copyProperties(images, ProductImages.class));
    }

    /**
     * 删除商品图片
     *
     * @param productIds 商品id集合
     * @author 杜伟毅
     * @since 2025/3/2 0002 16:41
     */
    @Override
    public void deleteBathImage(List<String> productIds) {
        if (isListEmpty(productIds)) throw new EmptyIdException("ProductImage的deleteBathImage");

        LambdaQueryWrapper<ProductImages> lqw = new LambdaQueryWrapper<>();
        lqw.in(ProductImages::getProductId, productIds);
        //删除OSS里的图片
        list(lqw).stream().map(ProductImages::getImageUrl).forEach(ossUtils::deleteImage);
        remove(lqw);
    }

    /**
     * 删除商品图片
     *
     * @param imgId 图片id
     * @author 杜伟毅
     * @since 2025/3/2 0002 16:41
     */
    @Override
    public Result<Void> deleteImage(String imgId) {
        if (StringUtils.isEmpty(imgId)) throw new EmptyIdException("ProductImages的deleteImage");
        ProductImages image = getById(imgId);
        if (ObjectUtils.isEmpty(image)) return Result.of(Status.BAD_REQUEST, "图片不存在", null);
        boolean remove = removeById(imgId);
        ossUtils.deleteImage(image.getImageUrl());
        return handleResult(remove, "图片删除成功", "图片删除失败");
    }


    /**
     * 用于上传商品图片
     *
     * @param images 图片文件
     * @author 杜伟毅
     * @since 2025/2/24 0024 0:17
     */
    @Override
    public Result<List<UploadImagesVO>> uploadProductImages(List<MultipartFile> images) throws IOException {
        // 1. 检查列表是否为空
        if (images == null || images.isEmpty()) {
            return fail(Status.BAD_REQUEST, "图片列表为空");
        }

        // 2. 检查文件数量是否超过限制（最多10张图片）
        if (images.size() > 10) {
            return fail(Status.BAD_REQUEST, "最多只能上传10张图片");
        }

        // 3. 检查列表中每个文件是否为空
        for (MultipartFile file : images) {
            if (isFileEmpty(file)) {
                return fail(Status.BAD_REQUEST, "图片文件为空");
            }
            //检查文件大小
            if (isFileOver(file.getSize(), 20.1)) { // 20MB
                return fail(Status.BAD_REQUEST, "图片超出范围，请上传小于20MB的图片");
            }
        }

        List<String> imagesUrl = ossUtils.uploadImages(images, PRODUCT_IMAGE.getUrl());
        return success(saveImagesToList(imagesUrl));
    }
}
